package com.zk.algorithm.math;

import com.zk.algorithm.Utils;
import com.zk.algorithm.annotation.Easy;
import com.zk.algorithm.annotation.LeetCodeExplore;

/**
 * 检测一个数是否是 3 的倍数
 *
 * @author zk
 */
@LeetCodeExplore
@Easy
public class PowerOfThree {

    // float: 6 ~ 7 位
    // double: 15 ~ 16 位
    public static final double THRESHOLD_VALUE = 0.1e-13;

    public boolean isPowerOfThree(int n) {
        if (n == 0) {
            return false;
        }

        // 3 ^ X = n
        // log(3 ^ X) = log(n)
        // X * log(3) = log(n)
        // X = log(n) / log(3)
        // X => 必须是整数

        double x = Math.log(n) / Math.log(3D);
        //                       取整
        //                        ↓
        // 1. 不能用 (int)(x) 因为是直接去掉小数点
        // 2. Math.round() 的返回类型是 int 整数, [10.5, 11.5) => 11
        // 3. Math.rint() 的返回类型是 double 浮点数 [10.5, 11.5) => 11.0
        //
        //            ↓
        //        跟自身判断
        return Math.abs(x - Math.rint(x)) <= THRESHOLD_VALUE;
    }

    public static void main(String...args) {
        Utils.println(new PowerOfThree().isPowerOfThree(3));
        Utils.println(new PowerOfThree().isPowerOfThree(9));
        Utils.println(new PowerOfThree().isPowerOfThree(27));
        Utils.println(new PowerOfThree().isPowerOfThree(81));
        Utils.println(new PowerOfThree().isPowerOfThree(80));
        Utils.println(new PowerOfThree().isPowerOfThree(243));
    }

}
